package gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import datos.DatosDelJuego;
import logica.Adivinador;

/**
 * Define los eventos que manejan los paneles principales, botones para cambio
 * de vista o acciones generales.
 */
public class ControlCentral implements ActionListener {

	// Declara la ventana principal del proyecto para posterior uso de sus
	// metodos.
	private VentanaAdivinador m_ventana;

	/**
	 * Construye el control de eventos tomando como parametro la ventana
	 * principal.
	 */
	public ControlCentral(VentanaAdivinador ventanaAdivinador) {
		m_ventana = ventanaAdivinador;
	}

	/** Crea los eventos generales. */
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == m_ventana.panelInicio.btnComenzar) {
			String nombreJugador = m_ventana.panelInicio.getNombre();

			if (!nombreJugador.isEmpty()) {
				// Agrega un nuevo jugador a las estadisticas.
				m_ventana.estadisticas.asignarJugador(nombreJugador);

				if (m_ventana.panelInicio.getModo() == PanelInicio.modo.FACIL) {
					// Muestra el panel para la eleccion de los animales.
					m_ventana.cards.show(m_ventana.panelPrincipal,
							"panelEleccion");
					m_ventana.panelBanner
							.setMensaje("Elige mentalmente uno de los siguientes animales.");
				} else
					irAPreguntas();
			} else {
				m_ventana.panelInicio
						.setMensajeError("Debe escribir un nombre para poder empezar a jugar.");
			}
		} else if (e.getSource() == m_ventana.panelEleccion.btnListo) {
			irAPreguntas();
		} else if (e.getSource() == m_ventana.panelPreguntas.btnRetroceder) {
			irAPreguntaAnterior();
		} else if (e.getSource() == m_ventana.panelPreguntas.btnSi) {
			irAPreguntaSiguiente(true);
		} else if (e.getSource() == m_ventana.panelPreguntas.btnNo) {
			irAPreguntaSiguiente(false);
		} else if (e.getSource() == m_ventana.panelRespuesta.btnSi) {
			m_ventana.panelBanner
					.setMensaje("Homerinator \"1\" - \"0\" perdedor.");
			// Al presionar el boton SI dentro del panel de respuesta
			m_ventana.estadisticas.partidaPerdida();
			// Guarda las estadisticas en el disco.
			DatosDelJuego.guardarEstadisticas(m_ventana.estadisticas);
			m_ventana.personaje.definirGesto(Personaje.gesto.DONUT);
			irAEstadisticas();
		} else if (e.getSource() == m_ventana.panelRespuesta.btnNo) {
			m_ventana.panelBanner.setMensaje("Seguro hiciste tramla!");
			// Al presionar el boton NO dentro del panel de respuestas:
			m_ventana.estadisticas.partidaGanada();
			// Guarda las estadisticas en el disco.
			DatosDelJuego.guardarEstadisticas(m_ventana.estadisticas);
			if (m_ventana.panelInicio.getModo() == PanelInicio.modo.DIFICIL)
				irAEntrenar();
			else{
				m_ventana.personaje.definirGesto(Personaje.gesto.SALIVA);
				irAEstadisticas();
			}
		} else if (e.getSource() == m_ventana.panelEstadisticas.btnSalir) {
			salir();
		} else if (e.getSource() == m_ventana.panelEstadisticas.btnRegresar) {
			volverAJugar();
		} else if (e.getSource() == m_ventana.panelEntrenar.btnCancelar) {
			volverAJugar();
		} else if (e.getSource() == m_ventana.panelEntrenar.btnEntrenar) {
			hacerEntrenamiento();
			volverAJugar();
		}
	}

	private void irAPreguntas() {

		m_ventana.cards.show(m_ventana.panelPrincipal, "panelPreguntas");
		m_ventana.panelBanner.setMensaje("Contesta a conciencia, tramposo!");
		// Pone el personaje con la imagen para las preguntas.
		m_ventana.personaje.definirGesto(Personaje.gesto.READY);

		// Preparando adivinador.
		m_ventana.adivino.vuelveAEmpezar();

		// Cargando la ventana de preguntas y pasando a ella.
		String pregunta = m_ventana.adivino.pregunta();
		m_ventana.panelPreguntas.setPregunta(pregunta);

	}

	private void irAPreguntaAnterior() {
		// Retrocede una pregunta pero no cambia de panel.
		m_ventana.adivino.vuelveAtras();
	}

	/** Muestra preguntas hasta el final, luego pasa al panel de respuesta. */
	private void irAPreguntaSiguiente(boolean preguntaCorrecta) {

		if (preguntaCorrecta) {
			m_ventana.personaje.definirGesto(Personaje.gesto.WOOHOO);
			// Avanza a la pregunta siguiente por la rama positiva.
			m_ventana.adivino.recibeRespuesta(Adivinador.opcion.SI);
			m_ventana.panelBanner.setMensaje("Lo sabía, soy un genio.");
		} else {
			m_ventana.personaje.definirGesto(Personaje.gesto.DOH);
			// Avanza a la pregunta siguiente por la rama negativa.
			m_ventana.adivino.recibeRespuesta(Adivinador.opcion.NO);
			m_ventana.panelBanner
					.setMensaje("Estas seguro de que no era un SI?");
		}

		if (!m_ventana.adivino.creeSaber()) {
			// Muestra cada pregunta.
			String pregunta = m_ventana.adivino.pregunta();
			m_ventana.panelPreguntas.setPregunta(pregunta);

		} else {

			String pregunta = m_ventana.adivino.pregunta();
			String ruta = m_ventana.adivino.piensaQueSeVeComo();
			m_ventana.panelRespuesta.setRespuesta(pregunta);
			m_ventana.panelRespuesta.setImagen(ruta);
			// Pasa al panel donde se muestra el posible resultado.
			m_ventana.cards.show(m_ventana.panelPrincipal, "panelRespuesta");
			m_ventana.panelBanner.setMensaje("El genio lo sabe todo.");
		}
	}

	/** Muestra y carga el panel de estadisticas con su tabla de puntos. */
	private void irAEstadisticas() {

		m_ventana.cards.show(m_ventana.panelPrincipal, "panelEstadisticas");

		m_ventana.panelEstadisticas.borrarRegistros();
		for (int i = 0; i < m_ventana.estadisticas.size(); i++) {

			String nombre = m_ventana.estadisticas.getNombre(i);
			Integer partidasGanadas = m_ventana.estadisticas
					.getPartidasGanadas(i);
			Integer partidasJugadas = m_ventana.estadisticas
					.getPartidasJugadas(i);
			m_ventana.panelEstadisticas.addRegistro(nombre, partidasGanadas,
					partidasJugadas);
		}
	}

	/** Muestra el panel de entrenamiento. */
	private void irAEntrenar() {

		m_ventana.personaje.definirGesto(Personaje.gesto.DISGRACE);
		m_ventana.cards.show(m_ventana.panelPrincipal, "panelEntrenar");
		m_ventana.panelBanner.setMensaje("No inventes animales, tramposo!");
	}

	/** Toma los datos del panel de entrenamiento y los entrega al adivino. */
	private void hacerEntrenamiento() {

		String nombre = m_ventana.panelEntrenar.getNombre();
		List<String> atributos = m_ventana.panelEntrenar.getAtributos();

		if (nombre.isEmpty() && !m_ventana.adivino.aprendeUn(nombre, atributos)) {
			// No se pudo agregar el nuevo elemento
			// Falta enviar un mensaje de error.
			// System.err.println("No se pudo aprender.");
		} else
			// Actualiza el arbol de atributos.
			DatosDelJuego.guardarArbolDeAtributos(m_ventana.adivino.getArbol());
	}

	private void salir() {
		m_ventana.personaje.definirGesto(Personaje.gesto.CRAZY);
		System.exit(0);
	}

	/** Reinicia el adivino y se dirige al panel de inicio. */
	private void volverAJugar() {
		m_ventana.adivino.vuelveAEmpezar();
		m_ventana.personaje.definirGesto(Personaje.gesto.YEAH);
		m_ventana.cards.show(m_ventana.panelPrincipal, "panelInicio");
		m_ventana.panelBanner.setMensaje("Juguemos otra vez!");
	}
}